home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / kaos / kaos_pat.0 / trkman_map.c < prev    next >
C/C++ Source or Header  |  1991-10-04  |  4KB  |  165 lines

  1. /*
  2. ----------------------------------------------------------------------
  3.      TRANSLATION OF TRKMANQ.F INTO C 
  4.      Compute only one set of manifolds and create a copy by iteration
  5. ----------------------------------------------------------------------
  6.      compute manifolds of ANY given set of hyperbolic fixed points
  7.      with eigenvalues and eigenvectors
  8.      m[us]f : finer divisions of manifolds
  9.      iskip : number of skips between each data
  10. ----------------------------------------------------------------------
  11. NOTE: In case of a negative eigenvalue use rnew = r * 2 
  12. ----------------------------------------------------------------------
  13. */
  14. #include "../include/x11r2_kaos_def.h"
  15.  
  16. #define DELFRAC 0.1
  17. void trkman_map(sevec,seval,xe,r,ms,mu,msf,muf,iskip,delman,n)
  18. int r,ms,mu,msf,muf,iskip,n;
  19. double **sevec,**seval,*xe,delman;
  20. {
  21.     int i,ic,jc,mc,kc,mf,man_index,icnt,color_index,color,ndid,rnew,negative_ev_on;
  22.     double fabs(),delx,xerr,factor0,factor,**x,**xp,*x1,*x2,exp(),log(),*dvector(),**dmatrix();
  23.     extern int stop,dot_size,fp_display_option,fi_maxsq;
  24.     extern double fi_eps,fi_epsf,fi_epsm;
  25.     extern char string[];
  26.  
  27.     x1 = dvector(0,n-1);
  28.     x2 = dvector(0,n-1);
  29.     mf = (muf > msf ? muf : msf);
  30.     x = dmatrix(0,mf-1,0,n-1);
  31.     xp = dmatrix(0,mf-1,0,n-1);
  32.  
  33.     for(ic=0;ic<n;ic++){    
  34.         /* if complex eigenvalue exit*/
  35.         if(seval[ic][1]!=0)
  36.             man_index = -1;
  37.         else {
  38.             if(fabs(seval[ic][0])>1){
  39.                 man_index = 0;
  40.                 color = Blue;
  41.             }
  42.             else {
  43.                 man_index = 1;
  44.                 color = Red;
  45.             }
  46.             if(seval[ic][0]<0){
  47.                 negative_ev_on=1;
  48.                 rnew = r * 2;
  49.             }
  50.             else {
  51.                 negative_ev_on=0;
  52.                 rnew = r;
  53.             }    
  54.         }
  55.         if(man_index==0) {
  56.             if(negative_ev_on){
  57.                 factor0=exp(log(seval[ic][0])*2./muf);
  58.             }
  59.             else{
  60.                 factor0=exp(log(seval[ic][0])/muf);
  61.             }
  62.         }
  63.         else if(man_index==1){
  64.             if(negative_ev_on){
  65.                 factor0=exp(log(seval[ic][0])*2./msf);
  66.             }
  67.             else{
  68.                 factor0=exp(log(seval[ic][0])/msf);
  69.             }
  70.         }
  71.  
  72.         sprintf(string,"Computing a manifold for ev[%d]...",ic);
  73.         printf("%s\n",string);
  74.         if(man_index==0){
  75.             printf("(Ev=%g %g)\n",seval[ic][0],seval[ic][1]);
  76.             printf("Evec %d = %g  \n",ic,sevec[ic][0]);
  77.             for(i=1; i<n; i++)
  78.                printf("          %g \n",sevec[ic][i]);
  79.              
  80.             for(jc=0;jc<2;jc++){
  81.                 factor = 1.;
  82.                 for(mc=0;mc<muf;mc++){
  83.                     if(jc==0){
  84.                         printf("Unstable manfold for ev[%d]...\n",ic);
  85.                         for(i=0;i<n;i++) x[mc][i] = xe[i]+delman*sevec[ic][i]*factor;
  86.                     }
  87.                     else {
  88.                         printf("Unstable manfold for ev[%d]...\n",ic);
  89.                         for(i=0;i<n;i++) x[mc][i] = xe[i]-delman*sevec[ic][i]*factor;
  90.                     }
  91.                     factor *= factor0;
  92.                 }
  93.                 icnt=0;
  94.                 for(kc=0;kc<mu;kc++){
  95.                     for(mc=0;mc<muf;mc++){
  96.                         fmap_user(x[mc],rnew,n);
  97.                         for(i=0;i<n;i++)x1[i]=x[mc][i];
  98.                         if((icnt % iskip)==0){
  99.                             (void) draw_record_pwf(x1,color,-1,dot_size,0,1);
  100.                               if(fp_display_option==1)
  101.                                   (void) draw_record_other_pwf(x1,rnew,color,-1,dot_size,0,1);
  102.                         }
  103.                         icnt++;
  104.                         if(stop){
  105.                             goto done;
  106.                         }
  107.                     }
  108.                 }
  109.             }
  110.         }
  111.         else if(man_index==1) {
  112.             printf("(Ev=%g %g)\n",seval[ic][0],seval[ic][1]);
  113.             printf("(Evec %d =%g %g)\n",ic,sevec[ic][0],sevec[ic][1]);
  114.             for(jc=0;jc<2;jc++){
  115.                 icnt=0;
  116.                 factor=1;
  117.                 for(mc=0;mc<msf;mc++){
  118.                     for(i=0;i<n;i++) xp[mc][i]=xe[i];
  119.                     if(jc==0){
  120.                         printf("Stable manfold for ev[%d]...\n",ic);
  121.                         for(i=0;i<n;i++) x[mc][i] = xp[mc][i]+delman*sevec[ic][i]/factor;
  122.                     }
  123.                     else {
  124.                         printf("Stable manfold for ev[%d]...\n",ic);
  125.                         for(i=0;i<n;i++) x[mc][i] = xp[mc][i]-delman*sevec[ic][i]/factor;
  126.                     }
  127.                     factor *= factor0;
  128.                 }
  129.                 for(kc=0;kc<ms;kc++){
  130.                     for(mc=0;mc<msf;mc++){
  131.                         /* install adjustable delc congtroller */
  132.                         /* currently it is divided by the same eigenvalue */
  133.                         for(i=0;i<n;i++){
  134.                             delx=(x[mc][i]-xp[mc][i])/seval[ic][0];
  135.                             x2[i]=x[mc][i]+delx;
  136.                             x1[i]=x1[i]- DELFRAC*delx;
  137.                         }
  138.                         (void) fmapi_user(x1,x2,x[mc],fi_maxsq,n,rnew,fi_eps,fi_epsf,&xerr,&ndid);
  139.                         if(stop){
  140.                             goto done;
  141.                         }
  142.                         for(i=0;i<n;i++){
  143.                             xp[mc][i]=x[mc][i];
  144.                             x[mc][i]=x1[i];
  145.                         }
  146.  
  147.                         if((icnt%iskip)==0){
  148.                             (void) draw_record_pwf(x1,color,-1,dot_size,0,1);
  149.                               if(fp_display_option=1)
  150.                                   (void) draw_record_other_pwf(x1,rnew,color,-1,dot_size,0,1);
  151.                         }
  152.                         icnt++;
  153.                     }
  154.                 }
  155.             }
  156.         }
  157.     }
  158.  
  159. done:
  160.     (void) free_dvector(x1,0,n-1);
  161.     (void) free_dvector(x2,0,n-1);
  162.     (void) free_dmatrix(x,0,mf-1,0,n-1);
  163.     (void) free_dmatrix(xp,0,mf-1,0,n-1);
  164. }
  165.